#include "color.h"

static unsigned int *lcd_p 		;			//lcd映射空间内存的指针
static unsigned int *temp_p 	;			//lcd映射空间内存的指针
static int lcd_fd 				;			//lcd的文件描述符
	

//1、打开lcd显示屏(color、申请lcd的所需内存空间，且初始化)
void Color_Lcd_Open(void)
{
	//1、打开lcd显示屏文件(以只写形式打开)
	lcd_fd = open("/dev/fb0", O_RDWR);
	if (-1 == lcd_fd){
		perror("open lcd error!\n");
		return ;
	}

	//2、写入颜色数据到lcd显示屏文件上
	lcd_p = mmap(
					NULL,  					//内核会自动分配地址
					800*480*4,				//lcd映射内存空间的长度(大小)
					PROT_READ|PROT_WRITE, 	//该映射空间可被写
					MAP_SHARED, 			//该映射空间可被其它进程访问
					lcd_fd,					//lcd的文件描述符
					0						//映射内存空间一开始的位置
				);
	if ((void *) -1 == lcd_p)
	{
		perror("mmap lcd error!\n");
		return ;
	}

	temp_p = lcd_p;							//记住lcd_p指针最初指向内存的地址的位置
	return ;
}



//2、显示颜色(指定任意一种颜色)
void Color_Show(int lcd_x, int lcd_y, int color_x, int color_y, int color)
{
	//1、任意位置显示颜色
	lcd_p = lcd_p + lcd_x;					//指定x轴的显示位置
	lcd_p = lcd_p + lcd_y*800;				//指定y轴的显示位置


	//2、任意大小显示颜色
	int x, y;
	for(y=0; y<color_y; y++)
	{
		for(x=0; x<color_x; x++)
		{
			*(lcd_p+x+y*800) = color;
		}
	}
	
	lcd_p = temp_p;							//让lcd_p重新回到最初指向内存的地址的位置

	return ;
}


//3、关闭lcd显示屏(释放内存、资源)
void Color_Lcd_Close(void)
{
	//1、解除映射lcd空间
	int ret_mun = munmap(lcd_p, 800*480*4);
	if (-1 == ret_mun)
	{
		perror("munmap lcd error!\n");
		return ;
	}

	//2、关闭lcd显示屏文件
	int ret_c = close(lcd_fd);
	if ( -1 ==ret_c){
		perror("close lcd error!\n");
		return ;
	}

	return ;
}
